package com.titaniume.exer;

import com.titaniume.java.Employee;
import org.junit.Test;

import javax.sound.midi.SoundbankResource;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 *@program: java8
 *@description:
 *@author: renfei.huang
 *@create: 2021-10-28 14:40
 */
public class TestLambda {

    List<Employee> employees = Arrays.asList(
            new Employee("tom", 22, 8888),
            new Employee("Jack", 23, 8964),
            new Employee("LiDa", 42, 7821),
            new Employee("JinHai", 35, 10000),
            new Employee("LiLei", 50, 15000),
            new Employee("YeXuan", 25, 30000),
            new Employee("HeLei", 15, 2350),
            new Employee("ZhoubaiTong", 14, 1500)
    );


    //调用Collections.sore() 方法，通过指定定制排序比较两个Employee （先按年龄比，年龄相同按姓名比） 使用Lambda 作为参数传递
    @Test
    public void  test1(){
        //定制排序
        Collections.sort(employees,(e1,e2) -> {
            if(e1.getAge() == e2.getAge()){
                return  e1.getName().compareTo(e2.getName());
            }else {
                return  -Integer.compare(e1.getAge(),e2.getAge());
            }
        });

        for (Employee emp :employees){
            System.out.println(emp);
        }
    }


    /**
     *
     *  ①：声明函数式接口，接口中声明抽象方法，public String getValue(String str);
     *  ②：声明类TestLambda ，类中编写抽象方法使用接口作为参数，将一个字符串转换为大写，并作为方法的返回值
     *  ③：在将一个字符串的第二个和第四个索引位置进行截取子串
     *
     *
     */
    @Test
    public  void test2(){

        System.out.println(strHandler("\t\t\t\t 我就是一个测试字符串", (e) -> e.trim()));

        System.out.println(strHandler("abcdafdsfafa", (str) -> str.toUpperCase()));

        System.out.println(strHandler("我是中国人，我爱我的祖国", (str) -> str.substring(2, 4)));
    }

    //需求：用于处理字符串
    public  String strHandler(String str,MyFunction mf){
        return  mf.getValue(str);
    }


    /**
     * ①：声明一个带两个泛型的函数式接口，泛型类型为<T,R> T为参数 R为返回值
     * ②接口中声明对于的抽象方法
     * ③：在Testlambda类中声明方法，使用借口哦作为承参数，计算两个long类型参数的和
     * ④：在计算两个long类型的乘积
     *
     */
    @Test
    public  void test3(){

        op(100L,200L,(x,y) -> x + y);
        op(100L,200L,(x,y) -> x * y);
        op(100L,200L,(x,y) -> x / y);
    }

    //需求： 对两个long类型数据进行处理
    public  void  op(Long l1,Long l2,MyFunction2<Long,Long> mf){
        System.out.println(mf.getValue(l1, l2));
    }
}
